<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>

</body>
<script>
	// 删除链表的一个节点
	/**
	 * 从双向链表中删除指定节点，并返回链表头节点
	 * @param {Object} node - 要删除的链表节点对象，需包含prev和next属性
	 * @returns {Object|null} 删除操作后的链表头节点（若无前驱节点则返回后继节点）
	 */
	function deleteNode(node) {
		// 处理删除头节点的情况
		if (!node.prev) {
			return node.next
		}
		
		// 更新后继节点的prev指针
		if (node.next){
			node.next.prev = node.prev ? node.prev : null
		}
		
		// 更新前驱节点的next指针
		if (node.prev) {
			node.prev.next = node.next? node.next : null
		}
		
		// 向前遍历找到链表头节点
		while (node.prev) {
			node = node.prev
		}
		return node
	}

	// 定义链表节点类
	class ListNode {
		constructor(value) {
			this.value = value;
			this.prev = null;
			this.next = null;
		}
	}

	// 创建一个简单的双向链表 1 <-> 2 <-> 3 <-> 4
	const node1 = new ListNode(1);
	const node2 = new ListNode(2);
	const node3 = new ListNode(3);
	const node4 = new ListNode(4);

	node1.next = node2;
	node2.prev = node1;
	node2.next = node3;
	node3.prev = node2;
	node3.next = node4;
	node4.prev = node3;

	// 测试删除头节点
	let newHead = deleteNode(node1);
	console.log("删除头节点后，新的头节点值应该是 2，实际是: ", newHead.value);

	// 测试删除中间节点
	newHead = deleteNode(node2);
	console.log("删除中间节点后，链表应该是 1 <-> 3 <-> 4，当前链表: ");
	let current = newHead;
	while (current) {
		console.log(current.value);
		current = current.next;
	}

	// 测试删除尾节点
	newHead = deleteNode(node4);
	console.log("删除尾节点后，链表应该是 1 <-> 3，当前链表: ");
	current = newHead;
	while (current) {
		console.log(current.value);
		current = current.next;
	}
</script>

</html>